المؤثرات


يمكن معالج القيم والمتغيرات بواسطة المعامل Operators لإنتاج قيم جديدة يتضمن المعاملات العددية مثل الإضافة والطرح والضرب والقسمة وباقي القسمة والقوى (الأس) ومعاملات النصوص مثل الدمج ومعاملات مقارنة الاعداد مثل <, >=, and == والنصوص مثل ge,eq .بينما القيم التي يتلاعب بها المعامل تسمى بالمعاملات operands. فمعامل الاثنائية Binary operators مثل الإضافة له left operand و right operand .بينما معامل الاحادية Unary operators مثل الناقص الوحيد له معاملة واحدة في اليمين single right operand .

قبل استخدام مختلف إليك بعض الاساسيات البسيطة لترقيم في الحواسيب التي هي من أربع صيغ اساسية:

0123 # 123 octal (83 decimal) 0x123 # 123 hexadecimal (291 decimal) 0b1010011 # 1010011 binary (83 decimal)

مؤاثرات النصوص

المؤثر DOT تقوم بعملية دمج للنصوص باضافة نص مع نص أخر

#!/usr/bin/perl -w  
$scalar_str = "Hello "."World\n";
$scalar_int = 42;
$scalar_fp = 1.01;

print $scalar_str . $scalar_int ."\n".$scalar_fp ;

المؤثر x يستعمل للتكرار مع النصوص شاهد المثال اسفل

print "abc" x 3; # تنتج 'abcabcabc'
#!/usr/bin/perl -w 
$width = 43; 
$padding = "\t" x ($width/8) . " " x ($width%8);
print $padding;

ويمكن أستخدام المؤثر x مع المصفوفات

@array =(1, 2, 3) x 3;# المصفوفة الان(1, 2, 3, 1, 2, 3, 1, 2, 3)
@array2=(@array1) x 3;# @array2الان (1, 2, 3, 1, 2, 3, 1, 2, 3)
@columns = (1) x 80;  # تنج 80 عنصر بالقيمة 1

مؤثرات العمليات الحسابية

كالجمع والطرح والضرب والقسمة وباقي القسمة

#!/usr/bin/perl

# The Binary Arithmetic Operators 
$a = 3 + 5 ;  # الجمع 
$x = 5 - 12;  # الطرح
$b = 5 * 5;   # الضرب
$Ex= 2 ** 5 ; # الاس 
$c = 10 / 2 ; # القسمة 
$m = 12 % 5;  # باقي القسمة 

print "ADDITION: $a \n"; 
print "SUBTRACTION: $x \n"; 
print "MULTIPLICATION: $b\n";
print "EXPONENTS: $Ex \n"; 
print "DIVISION: $c \n"; 
print "REMAINDER: $m \n";


# The Unary Arithmetic Operators
$p=-14;
$n=23; 
$pp=15 - +$p; #operand +op1 
$nn=25 + -$n; #operand -op1

print "Positive operand +op1: $pp \n"; 
print "Negative operand -op1: $nn \n";

++$n; #الزيادة بمقدار واحد prefix يزتاد المتغير ثم يعاد
--$n; #النقص بمقدار واحد prefix يقل المتغير ثم يعاد

$n++; #الزيادة بمقدار واحد postfix يعاد المتغير ثم يزتاد
$n--; #النقص بمقدار واحد postfix يعاد المتغير ثم يقل

$Square = sqrt(121); # الجذر التربيعي 
print "The square root of 121 is $Square\n";

العوامل العلائقية

التالي عوامل المقارنة بين الأعداد والحروف النصية

عددي نصي الوصف
== eq يساوي equalty
!= ne لايساوي INEQUALTY
< lt أصغر من LESS THEN
> gt أكبر من GREATER THEN
<= le أصغر من أو يساوي LESS THEN OR EQUAL
>= ge أكبر من أو يساوي GREATER THEN OR EQUQL
<=> cmp مقارنة بين قيمتين comparison

في الحالة الاخيرة تعيد -1 اذا الايسر اصغر من الايمن ، وتعيد 0 اذا كان متساوين ، وتعيد +1 اذا كانت قيمة الايسر اكبر من الايمن

ويمكن استخدم ادوات الشرط للمقارنة الحروف النصية

#!/usr/bin/perl -w 
$i = Hello; 
if($i eq 'Hello') { 
print "Hello!\n"; 
}
else {  
print "The variable (i) doesn't equal the correct string!\n"; 
}

مؤاثرات التخصيص المجتمعة

البيرل تؤفر مؤثرات التخصيص كما في شكل السي والصيغة العامة:

$variable <operator>= $value;

وهي تكافئ تماماً الصيغة

$variable =$variable <operator> $value;

فعلى سبيل المثال

$Count = $Count + 1;
$Count += 1  ; # نفس عملية القراءة  
print "$Count\n";

نفس الامر مع باقي المؤاثرات


الحسابية النصوص الإزاحة المنطقية Bitwise
+= x= <<= ||= |=
-= .= >>= &&= &=
*= ^=
/=
**=
%=

المؤثرات المنطقية

كما تملك لغة البيرل العوامل المنطقية

&&  AND  # تعيد صواب اذا كان الكل صواب  
||  OR   # تعيد صواب اذا كان واحد منهما صواب او كليهما
    XOR  # تعيد صواب اذا واحد منهما فقط صواب
!   NOT  # تعيد صواب اذا كان غير صواب

العوامل الأربعة لها عوامل علائقية تطبق عليها مثل اكبر > اصغر < اكبر او يساوي >= أقل او يساوي <= يساوي == ولايساوي != وتكون نتيجة تطبيقها إما الصواب true (1) أو الكذب false (0) وتستخدم تلك بكثرة مع ادوات الشرط كما سنرها لاحقاً ان شاء الله

تستخدم العوامل كحروف مثل AND أو رموز && ،واليك المثال التالي لحصول على النتائج المختلفة

#!/usr/bin/perl -w
printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
                "Conditional AND (&&)", "false && false", ( 0b0 && 0b0 ),
                "false && true", ( 0b0 && 0b1 ),
                "true && false", ( 0b1 && 0b0 ),
                "true && true", ( 0b1 && 0b1 ) );

printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
                "Conditional OR (||)", "false || false", ( 0b0 || 0b0 ),
                "false || true", ( 0b0 || 0b1 ),
                "true || false", ( 0b1 || 0b0 ),
                "true || true", ( 0b1 || 0b1 ) );
        
printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
                "Boolean logical AND (&)", "false & false", ( 0b0 & 0b0 ),
                "false & true", ( 0b0 & 0b1 ),
                "true & false", ( 0b1 & 0b0 ),
                "true & true", ( 0b1 & 0b1 ) );

printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
                "Boolean logical inclusive OR (|)",
                "false | false", ( 0b0 | 0b0 ),
                "false | true", ( 0b0 | 0b1 ),
                "true | false", ( 0b1 | 0b0 ),
                "true | true", ( 0b1 | 0b1 ) );

printf( "%s\n%s: %b\n%s: %b\n%s: %b\n%s: %b\n\n",
                "Boolean logical exclusive OR (^)",
                "false ^ false", ( 0b0 ^ 0b0 ),
                "false ^ true", ( 0b0 ^ 0b1 ),
                "true ^ false", ( 0b1 ^ 0b0 ),
                "true ^ true", ( 0b1 ^ 0b1 ) );
        
printf( "%s\n%s: %b\n%s: %b\n", "Logical NOT (!)",
                "!false", ( !0b0 ), "!true", ( !0b1 ) );

مؤثرات Bitwise

تستعمل كالدوائر المنطقية حيث تبدل القيمة الى الترميز الثنائي ويتم عملية المقارنة بين كل اثنين بت

& 	Bitwise AND
| 	Bitwise OR
^ 	Bitwise XOR
~ 	Bitwise NOT
يستخدم & لوضع قناع MASK يشمل عدة بتات لإستخراجة مرة ثانية لكي يستخدم لغرض خاص، ايضاَ يستخدم في الشرط عندما نريد أختبار مدخل الصفر
unless($var & $var) { }
في المثال السابق استخدام & مع جملة الشرط unless فاذا ادخلنا صفر الى المتغير يدخل الشرط .

ميزات مؤثرات bitwise تتعامل مع النصوص ،فالمقارنة تنجز حرف بواسطة حرف ، وكل حرف لدية ترمز في ASCII والتي تعاد الى الترميز الثنائي فعلى سبيل المثال لإعادة الحرف الكبير الى حرف صغير من خلال المؤثر | مع المسافة ' '، فقيمة المسافة في ASCII هو الاختلاف بين قيمة الحروف الكبيرة مع الحروف الصغيرة

print 'A' | ' ';   # produces 'a'

بالنظر الى ترميز ASCII الثنائي هناك بت واحد فقط يختلف بين الحرف الكبير والحرف الصغير لذا من السهولة التحويل بواسطة "or Bitwise"

symbol binary     DEC
'A' = 10000001    65 
' ' = 01000000    32
'a' = 11000001    97

الشكل المعاكس لمسافة هي الشرطة التحتية underscore التي هي 10111111 في الثنائي و95 في العشري.

print 'upper' & '_____';   # produces 'UPPER'

وكذلك التعامل مع القيم العددية

print 123 | 456;   # produces '507'
print '123' | '456';   # produces '577'

القيمة العددية تمثل بقيمة واحدة في الترميز الثنائي

123 = 001111011
456 = 111001000
507 = 111111011

بواسطة علامات الاقتباس تمثل كنص ويمثل العدد بواسطة جدول ASCII والمقارنة تتم من خلال كل رقم مع مايقابلة ، مثلاًُ '1' | '4' تنتج '5'....وكذلك مع باقي الاعداد

هناك مشكلة مع العدد 0 فهو ليس عدد كالاعداد الاخرى مع النصوص ويمثل بايت NULL (فكل نص لة بايت ملغية لتشير الى نهاية هذا النص )اذا كان النص اصغر من الاخرى

print '2000' | '0030';   # produces '2030'
#Note that padding is important here.
print '2000' | '30';   # produces '3000'

بمقارنة الحرف او البايت الملغية مع العدد الموجود في جدول ASCII

2 = 0110010   0=0110000  0 = 0110000  0=0110000
3 = 0110011   0=0110000  NUL=0000000
3 = 0110011   0=0110000  0 = 0110000  0=0110000

المثال التالي يوضح مختلف مواثرات

#!/usr/bin/perl
$a = 3;
$b = 6;
$r;
printf "$a = %03b \n", $a;
printf "$b = %03b \n", $b;
$r = $a & $b; printf "$a & $b = %03b = %d\n", $r, $r;
$r = $a | $b; printf "$a | $b = %03b = %d\n", $r, $r;
$r = $a ^ $b; printf "$a ^ $b = %03b = %d\n", $r, $r;
$r = ~$a; printf "~$a = %03b = %d\n", $r, $r;

فالدالة printf تقوم بطابعة النص لكنها تنجز العملية الخاصة فعندما تمر الدالة من البارامتر %b فانها تقوم بالطابعة بالترميز الثنائي، وتم استعمال خيار حقل العرض 03 وهو العدد الذي سيخصص كاقصى حقل عرض للبارميتر ، والبارامتر %d يقوم بطباعتها بالعشري ،ملاحظة ان الاعداد تخزن بطول 32 bits بحسب نوع المعالج

Output

3 = 011
6 = 110
3 & 6 = 010 = 2
3 | 6 = 111 = 7
3 ^ 6 = 101 = 5
~3 = 11111111111111111111111111111100 = -4


مؤثرات الازاحة

مؤثر الازاحة فهي مؤثرات خاصة لمؤاثرات Bitwise

<< مؤثر الازاحة نحو اليسار left shift : يتم اضافة صفر في بداية الoperand وتقوم بدفع البتات الاخرى الى اليسار وفي هذة الحالة تخرج وتلغى البت الاخيرة
>> مؤثر الازاحة نحو اليمين right shift : يتم اضافة صفر في نهاية الoperand وتقوم بدفع البتات الاخرى الى اليمين وفي هذة الحالة تخرج وتلغى البت الاولى

ويمكننا من تحريك كل الـ bits سواء الى اليسار او اليمين التي تفيد في عمليات القسمة او ضرب الأعداد الصحيحة ،نعلم ان الثنائي من عنصرين 0 و 1 لو اردنا القسمة على 2 نزيح القيمة مرة واحدة ولو اردنا القسمة على 4 نزيح مرتين وهكذا

$firstVar = 128;
$secondVar = $firstVar >> 2;
print("$secondVar\n"); # ينتج 32

قبل وبعد الإزاحة حدث التالي عندما تحرك البت من موضع الى موضع اخر ، يخصص المتغير الاول بالقيمة 128 التي تساوي في الترميز الثنائي 10000000 ، بإزاحة هذة القيمة الى مواضعين تصبح القيمة الجديدة 00100000 او 32 في العشري تخصص الى المتغير الثاني secondVar ، البتات المنتقلة نحو اليمين عند الازاحة تفقد وتلغى

مثال اخر بقسمة على 8

$firstVar = 129;  # 129 in binary 10000001
$secondVar = $firstVar >> 3; 
print("$secondVar\n"); # ينتج 16

عند الازاحة نحو اليمين بثلاث مواضع الناتج يصبح 00010000 او 16 وتخصص الى المتغير الثاني ، هكذا نفس الشيء مع ضرب الأعداد الصحيح في 2، 4،8 ، 16 ...بإستبدال الإزاحة نحو اليمين الى اليسار

مؤثرات اخرى

كالمؤثر , الذي مأخوذ من السي للفصل بين المتغيرات

$var1 = 1, $var2 = $var1;

مؤثرات الشرط ايضاً مأخوذ من السي

$result = ($var == 0) ? 14 : 7;

حيث $var == 0 هنا الشرط فاذا كان الناتج true اوالمتغير يساوي 0 سوف ياخذ القيمة 14 ، واذا كانت النتجية false سوف ياخذ 7 ،هنا نفس المثال بستخدام بنية الشرط if , else

if ($var == 0) {
        $result = 14;
} else {
        $result = 7;
}

الاسبقية في المؤاثرات


المؤثرات Associativity
++, -- Not applicable
-, ~, ! Right-to-left
** Right-to-left
=~, !~ Left-to-right
*, /, %, x Left-to-right
+, -, . Left-to-right
<<, >> Not applicable
-e, -r, etc. Left-to-right
<, <=, >, >=, lt, le, gt, ge Left-to-right
==, !=, <=>, eq, ne, cmp Left-to-right
& Left-to-right
|, ^ Left-to-right
&& Left-to-right
|| Left-to-right
.. Left-to-right
? and : Right-to-left
=, +=, -=, *=, Right-to-left
, Left-to-right
not Left-to-right
and Left-to-right
or, xor Left-to-right

لغة البرمجة البيرل تنفذ ترتيب المعاملات حسب اسبقية المعاملات الاتيه : فمثلاً x=3^2 * 44 + 126 /6 وفق لقواعد التنفيذ التي ذكرنها فسوف يتم تنفيذ رفع القيمة 3 الأس 2 أولاً ونرى هنا عملية الضرب والقسمة وبما ان معامل القسمة والضرب لها نفس الاولية فسوف يتم تنفيذ اولية الضرب اولاً وذلك لانه في حالة تساوي الاسبقية يتم تنفيذ المعاملات حسب ترتيب الاسبقية من اليسار الى اليمين ، وبعد تنفيذ عملية الضرب يتم تنفيذ عملية القسمة ثم عملية الجمع x=9 * 44 + 126 /6 x=396 + 126 /6 x=396 + 21 x=417 يمكنا التحكم في التعبيرات المعقدة داخل العمليات الاحسابية بواسطة الأقواس كما نريد حيث تأخذ اسبقية التنفيذ بغض النظر عن اسبقية المعاملات على سبيل المثال ننظر الى هذة المعادلة : x=3^2 * (44 + 126) /6 سيتم جمع 44 الى 126 قبل اي عملية داخل هذة المعادلة ثم يتم تنفيذ باقي المعادلة تبعاً لاسبقية المعامل .